#!/bin/bash
### BEGIN INIT INFO
# Provides:             webredis
# Required-Start:       $syslog $remote_fs
# Required-Stop:        $syslog $remote_fs
# Should-Start:         $local_fs
# Should-Stop:          $local_fs
# Default-Start:        2 3 4 5
# Default-Stop:         0 1 6
# Short-Description:    webredis
# Description:          webredis
### END INIT INFO
# 启动 webredis
# 在 service 管理系统服务的平台要修改service_user和service_folder
# 在 systemctl 管理系统服务的平台,不要直接使用此脚本控制服务启动，
# 应该创建 /etc/systemd/system/webredis.service,在 webredis.service 中调用此脚本，此脚本不需要修改

# 指定运行脚本的帐户名,用于 service 管理系统服务时要修改此变量为指定启动的服务的帐户
service_user=$(whoami)
# 指定运行脚本,用于 service 管理系统服务时要修改此变量为固定常量
webredis_js=
# 指定服务工作文件夹,用于 service 管理系统服务时要修改此变量为固定常量
service_folder=$(dirname $webredis_js)
# 指定运行脚本日志输出文件
webredis_out="webredis.out"

# webredis 连接参数,用于 service 管理系统服务时要修改为常量
webredis_port=
redis_host=
redis_port=
redis_password=
redis_database=
##################################

[ "$service_user" != "$(whoami)" ] && [ "$(whoami)" != 'root' ] && echo "必须在 $service_user 或 root 用户下执行" && exit -1

config="$HOME/.facelog/config.properties"
function prop {
	[ -f "$config" ] && grep -P "^\s*[^#]?${1}=.*$" $config | cut -d'=' -f2
}
## 读取properties中的参数，并创建参数名命名的变量，如果参数名中包含'.'则替换为'-'
if [ -f "$config" ]
then
	echo "load property from $config"
	while IFS='=' read -r key value
	do
		[ -z "$key" ] && continue
		# '.'替换为'-'
		key=$(echo $key | tr '.' '_')
		## 不处理＃起始的key
		[[ -z $(echo "$key" | grep -E '\s*#+.*' ) ]] \
			&& eval "${key}='${value}'"
	done < "$config"
else
	echo "$config not found."
fi

[ -z "$redis_host" ] && redis_port=localhost
[ -z "$redis_port" ] && redis_port=6379
[ -z "$webredis_port" ] && webredis_port=16379
[ -z "$nodejs_exe" ] && nodejs_exe=$(which node)
# 优先使用 $webredis_js 定义的脚本
[ -n "$webredis_js" ] && webredis_file="$webredis_js"
[ -z "$webredis_file" ] && echo "ERROR:not define webredis.file in $config" && exit -1
[ ! -f "$webredis_file" ] && echo "ERROR:not found file $webredis_file" && exit -1

## 停止 webredis redis
function stop(){
	local file=$(basename $webredis_file)
	local basenode=$(basename $nodejs_exe)
	local webredis_pid=$(ps -ef | grep -E ".*$basenode\s+.*$file" | awk '{print $2}')
	if [ -n "$webredis_pid" ]
	then
		kill -9 $webredis_pid || exit -1
		echo "webredis $webredis_pid killed"
	fi
	if [ "$redis_host" = 'localhost' ] && [ -n "$redis_exe" ]
	then
		local redis_pid=$(ps -ef | grep -E "redis-server\s+\S+:$redis_port" | awk '{print $2}')
		if [ -n "$redis_pid" ]
		then
			kill -9 $redis_pid || exit -1
			echo "redis $redis_pid killed" 
		fi
	fi
}
## 启动 redis webredis
function start(){
	# 判断 redis 是否可连接
	if ! nc -vw 2 $redis_host $redis_port >/dev/null
	then		
		if [ "$redis_host" = 'localhost' ] && [ -n "$redis_exe" ]
		then
			# 当前运行的 redis-server 端口号
			local port=$(ps -ef | grep -E "redis-server\s+\S+:$redis_port" -o | sed 's/.*://')
			# redis 没有启动则启动 redis
			if [ -z "$port" ]
			then 
				local arg_port=
				[ -n "$redis_port" ] && arg_port="--port $redis_port"
				local argp_assword=
				[ -n "$redis_password" ] && argp_assword="--requirepass $redis_password"
				$redis_exe --daemonize yes ${arg_port} ${argp_assword} || exit -1
			else
				echo "WARN:本地redis服务($redis_port)没有启动"
			fi
		else
			echo "WARN:redis服务(redis://:$redis_password@$redis_host:$redis_port/$redis_database)无法连接"
		fi
	fi
	[[ $(curl -s localhost:$webredis_port ) == webredis* ]] && status && exit 0
	

	# 是否挂起
	local no_hang_up=0;
	# 是否输出重定向
	local redirect=" > $webredis_out 2>&1";
	# 解析输入参数
	while [ $# -ge 1 ] ; do
		case "$1" in
			-u|--hup) no_hang_up=1; shift 1;;
			-s|--stdout) redirect='' ; shift 1;;
			*) echo "无效参数 $1." ; exit -1;;
		esac
	done
	[ -n "$webredis_port"  ] && arg_webredis_port="--port $webredis_port"
	[ -n "$redis_host"     ] && arg_webredis_rport="--rhost $redis_host"
	[ -n "$redis_port"     ] && arg_webredis_rport="--rport $redis_port"
	[ -n "$redis_password" ] && arg_webredis_rauth="--rauth $redis_password"
	[ -n "$redis_database" ] && arg_webredis_rdb="--rdb $redis_database"

	local run_cmd="$nodejs_exe $webredis_file $arg_webredis_port $arg_webredis_rport $arg_webredis_rauth $arg_webredis_rdb"
	echo run_cmd=$run_cmd
	# 启动 webredis
	echo "启动 webredis 服务(start webredis service)..."
	[ -n "$redirect" ] && echo "执行 tail -f $webredis_out 查看控制台输出"
	if [ $no_hang_up -eq 0 ] 
	then		
		if [ "$service_user" != "$(whoami)" ]
		then
			su -c "cd $service_folder;nohup $run_cmd $redirect &" - "$service_user"
		else
			eval nohup $run_cmd $redirect &
		fi
	else
		# --hup 用于 systemctl 控制
		eval $run_cmd $redirect
	fi
}

## 显示redis webredis服务状态
function status(){
	# 当前运行的 redis-server PID
	local redis_pid=$(ps -ef | grep -E "redis-server\s+\S+:$redis_port" | awk '{print $2}')
	# 检测 redis 是否正常运行
	[ -n "$redis_pid" ] && echo "redis    [ON] PID $redis_pid PORT $redis_port " || echo "redis    [OFF]"
	local file=$(basename $webredis_file)
	local basenode=$(basename $nodejs_exe)
	local webredis_pid=$(ps -ef | grep -E ".*$basenode\s+.*$file" | awk '{print $2}')
	# 检测webredis是否正常运行
	[[ $(curl -s localhost:$webredis_port ) = webredis* ]] && echo "webredis [ON] PID $webredis_pid PORT $webredis_port" || echo "webredis [OFF]"
}
pushd $service_folder > /dev/null 2>&1
case $1 in
	start)
		shift 1;
		start $*
		exit 0
		;;
	stop)
		stop
		exit 0
		;;
	status)
		status				
		exit 0
		;;
	restart|force-reload)
		stop
		start
		exit 0
		;;
	*)
		echo "Usage: /etc/init.d/webredis {start|stop|restart|force-reload|status}"
		exit 1
		;;
esac
popd > /dev/null 2>&1
